// todo 1-14 封装axios
// todo 1-14-1 导入axios,token
import axios from 'axios'

import { getLocalToken, setLocalToken } from '@/utils/token'

// 导入
import JSONbig from 'json-bigint'
// todo 1-14-5 导入 toast
// import { Toast } from 'vant'
// todo 1-14-2 配置axios

// 可以通过axios的transformResponse方法，这个方法的作用是在传递给then/catch前，允许修改响应数据

// axios在这里默认把响应体从json字符串转成了js对象
axios.defaults.transformResponse = [function (data) {
  // console.log('big Int')
  // console.log(data)// 这里的data是字符串，在这个字符串的是没有丢失精度的，所以需要在这里先把精度调好
  try {
    // 作用1：把json字符串转为js对象
    // 作用2：把里面的大数字做安全处理
    return JSONbig.parse(data)
  } catch {
    return data
  }
  // return data;
}]

// 如果不写这个方法，返回的数据是自动就转为json对象的了，如果写了，就要自己转为对象，即return JSON.parse(data)

const instance = axios.create({
  baseURL: process.env.VUE_APP_URL,
  headers: { 'Content-Type': 'application/json' }
})

// todo 1-14-7 接口错误处理
// todo  1-14-3 请求拦截
instance.interceptors.request.use(
  function (config) {
    if (config.needToken) {
      config.headers = {
        // 如果token存在就获取，否则就是默认token
        Authorization: `${getLocalToken('token')}`
          ? `Bearer ${getLocalToken('token')}`
          : 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDMyODQzNjYsInVzZXJfaWQiOjF9.mLYitrKsn4E4KdQd0CNPugKrH8uQmXEQTlG_JutC8jU'
      }
    }
    // todo 1-14-6 全局取消接口操作 代做

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// todo 1-14-4 响应拦截
instance.interceptors.response.use(
  function (response) {
    if (response.status === 201 || response.status === 200 || response.status === 204) {
      return response.data
    } else if (response.status === 400) {

    } else if (response.status === 401) {

    } else if (response.status === 507) {
      return Promise.reject(new Error('数据库错误，别理'))
    }
  },
  async function (error) {
    // 处理错误的返回数据
    // 判断状态是否为 401
    if (error.response.status === 401) {
      // 更新 token：将 refhresh_token  提交到服务器得到新的 token
      // 得到 refresh_token
      const refreshToken = getLocalToken('token').refresh_token
      // 提交服务器
      const resToken = await instance({
        url: '/app/v1_0/authorizations',
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${refreshToken}`
        }
      })
      // 创建一个新的 token 对象
      var tokenObj = {
        token: resToken.data.data.token,
        refresh_token: refreshToken
      }
      // 将新的 token 保存到本地
      setLocalToken('token', tokenObj)
      // 继续发送之前报错的请求 error.config : baseURL Authorization
      return await instance(error.config)
    }
    // Do something with response error
    return Promise.reject(error)
  }
)

// todo 1-14-8 统一处理所有接口请求
const _ajax = function (obj) {
  return new Promise((resolve, reject) => {
    instance(obj)
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        console.log('统一处理所有接口')
        console.log(err)
      })
  })
}

export default _ajax
